package LeetCode75;

import publicClass.TreeNode;

/**
 * 236. 二叉树的最近公共祖先
 * 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
 *
 * 百度百科中最近公共祖先的定义为：“对于有根树 T 的两个节点 p、q，最近公共祖先表示为一个节点 x，满足 x 是 p、q 的祖先且 x 的深度尽可能大（一个节点也可以是它自己的祖先）。”
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
 * 输出：3
 * 解释：节点 5 和节点 1 的最近公共祖先是节点 3 。
 * 示例 2：
 *
 *
 * 输入：root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
 * 输出：5
 * 解释：节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
 * 示例 3：
 *
 * 输入：root = [1,2], p = 1, q = 2
 * 输出：1
 *
 *
 * 提示：
 *
 * 树中节点数目在范围 [2, 105] 内。
 * -109 <= Node.val <= 109
 * 所有 Node.val 互不相同 。
 * p != q
 * p 和 q 均存在于给定的二叉树中。
 */
public class T0236_二叉树的最近公共祖先 {
    //使用递归判断 该节点是否是P和Q的祖先 如果是就继续向下寻找更近的祖先
    TreeNode node = null;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

       dfs(root,p,q);
       return node;

    }

    void dfs(TreeNode root, TreeNode p, TreeNode q){
        //是p q 的祖先 继续寻找
        if (findNode(root,p)&&findNode(root,q)) {
            node = root;
            dfs(root.left, p, q);
            dfs(root.right, p, q);
        }
    }


    //node 存在于该root节点下
    public boolean findNode(TreeNode root,TreeNode node){

        if (root==null) {
            return false;
        }

        if (root.val==node.val) {
            return true;
        }

       return findNode(root.left,node)||findNode(root.right,node);


    }


}
